#ifndef _WX_GTK_FILEPICKER_H_
#define _WX_GTK_FILEPICKER_H_

// since GtkColorButton is available only for GTK+ >= 2.4,
// we need to use generic versions if we detect (at runtime)
// that GTK+ < 2.4
#include "wx/generic/filepickerg.h"
#define FILEDIRBTN_OVERRIDES                                                  \
  virtual wxWindow *GetDialogParent()                                       \
  {                                                                         \
    return NULL;                                                          \
  }                                                                         \
  \
  virtual bool Destroy()                                                    \
  {                                                                         \
    if (m_dialog)                                                         \
      m_dialog->Destroy();                                              \
    return wxButton::Destroy();                                           \
  }                                                                         \
  \
  protected:                                                                    \
  virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const \
  { return NULL; }

class wxFileButton : public wxGenericFileButton {
  public:
    wxFileButton() { m_dialog = NULL; }
    wxFileButton( wxWindow *parent,
                  wxWindowID id,
                  const wxString& label = wxFilePickerWidgetLabel,
                  const wxString &path = wxEmptyString,
                  const wxString &message = wxFileSelectorPromptStr,
                  const wxString &wildcard = wxFileSelectorDefaultWildcardStr,
                  const wxPoint& pos = wxDefaultPosition,
                  const wxSize& size = wxDefaultSize,
                  long style = wxFILEBTN_DEFAULT_STYLE,
                  const wxValidator& validator = wxDefaultValidator,
                  const wxString& name = wxFilePickerWidgetNameStr ) {
      m_dialog = NULL;
      Create( parent, id, label, path, message, wildcard,
              pos, size, style, validator, name );
    }

    virtual ~wxFileButton();


  public:     // overrides

    bool Create( wxWindow *parent,
                 wxWindowID id,
                 const wxString& label = wxFilePickerWidgetLabel,
                 const wxString &path = wxEmptyString,
                 const wxString &message = wxFileSelectorPromptStr,
                 const wxString &wildcard = wxFileSelectorDefaultWildcardStr,
                 const wxPoint& pos = wxDefaultPosition,
                 const wxSize& size = wxDefaultSize,
                 long style = 0,
                 const wxValidator& validator = wxDefaultValidator,
                 const wxString& name = wxFilePickerWidgetNameStr );

    // event handler for the click
    void OnDialogOK( wxCommandEvent & );
    virtual long GetDialogStyle() const {
      return ( wxGenericFileButton::GetDialogStyle() &
               ~( wxFD_SAVE | wxFD_OVERWRITE_PROMPT ) ) | wxFD_OPEN;
    }

    virtual void SetPath( const wxString &str );

    // see macro defined above
    FILEDIRBTN_OVERRIDES

  protected:
    wxDialog *m_dialog;

    DECLARE_DYNAMIC_CLASS( wxFileButton )
};


//-----------------------------------------------------------------------------
// wxDirButton
//-----------------------------------------------------------------------------

class wxDirButton : public wxGenericDirButton {
  public:
    wxDirButton() { Init(); }
    wxDirButton( wxWindow *parent,
                 wxWindowID id,
                 const wxString& label = wxFilePickerWidgetLabel,
                 const wxString &path = wxEmptyString,
                 const wxString &message = wxFileSelectorPromptStr,
                 const wxPoint& pos = wxDefaultPosition,
                 const wxSize& size = wxDefaultSize,
                 long style = wxDIRBTN_DEFAULT_STYLE,
                 const wxValidator& validator = wxDefaultValidator,
                 const wxString& name = wxFilePickerWidgetNameStr ) {
      Init();
      Create( parent, id, label, path, message, wxEmptyString,
              pos, size, style, validator, name );
    }

    virtual ~wxDirButton();


  public:     // overrides

    bool Create( wxWindow *parent,
                 wxWindowID id,
                 const wxString& label = wxFilePickerWidgetLabel,
                 const wxString &path = wxEmptyString,
                 const wxString &message = wxFileSelectorPromptStr,
                 const wxString &wildcard = wxFileSelectorDefaultWildcardStr,
                 const wxPoint& pos = wxDefaultPosition,
                 const wxSize& size = wxDefaultSize,
                 long style = 0,
                 const wxValidator& validator = wxDefaultValidator,
                 const wxString& name = wxFilePickerWidgetNameStr );


    // GtkFileChooserButton does not support GTK_FILE_CHOOSER_CREATE_FOLDER
    // thus we must ensure that the wxDD_DIR_MUST_EXIST style was given
    long GetDialogStyle() const {
      return ( wxGenericDirButton::GetDialogStyle() | wxDD_DIR_MUST_EXIST );
    }

    virtual void SetPath( const wxString &str );

    // see macro defined above
    FILEDIRBTN_OVERRIDES

  protected:
    // common part of all ctors
    void Init() {
      m_dialog = NULL;
      m_bIgnoreNextChange = false;
    }

    wxDialog *m_dialog;

  public:    // used by the GTK callback only

    bool m_bIgnoreNextChange;

    void UpdatePath( const char *gtkpath ) { m_path = wxString::FromUTF8( gtkpath ); }

  private:
    DECLARE_DYNAMIC_CLASS( wxDirButton )
};

#undef FILEDIRBTN_OVERRIDES

#endif // _WX_GTK_FILEPICKER_H_

